1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225
| **中 山 大 学 资 讯 管 理 学 院**
**科 研 训 练 报 告**
| 科研课题名称 : | 社会化媒体用户——平台互动均衡下隐私规划机理研究 | | --- | --- | | 院系: | 资讯管理学院 | | 专业: | 信息管理与信息系统 | | 姓名: | 李偉彬 | | 学号: | 17372028 | | 指导老师: | 朱侯 | | 完成时间: | 2019年1月15日 |
目录
一.爬虫网站分析 2
1.1新浪微博数据价值分析 2
1.2新浪微博站点分析 3
二.新浪微博爬虫构建 3
2.1爬虫流程构建 3
2.2新浪微博的转发数据封装和数据请求 5
三.数据可视化 7
3.1分词 统计词频 7
3.2生成词云 8
3.3生成网络图 9
3.4应用讨论 10
四.总结与展望 11
# 一.爬虫网站分析
## 1.1新浪微博数据价值分析
微博是基于用户关系的社交媒体平台,用户可以通过PC、手机等多种移动终端接入,以文字、图片、视频等多媒体形式,实现信息的即时分享、传播互动。而新浪微博是中国最早兴起的自媒体平台,理念就是人人都是自媒体,人人都可以在这里发表自己的观点。到现在微博已经成为了官方,明星等"新闻发布"的第一阵地,比如政府发条微博向社会通报某件社会事件的进展情况等。
当然,对于我们普通人,也常会发微博,或者转发,评论来表达自己对于社会事件的观点,也会来表现自己生活的日常,或开心,或吐槽。
而对于社科研究领域来说,最重要的就是微博不同于QQ空间,不同于微信朋友圈等其他社交平台,不需要对方加你,也不需要你关注对方,你就可以看到对方的全部动态,个人信息,转发信息。因此微博信息是一个非常有价值的数据金矿,在上面可以完成多种的分析和挖掘。
## 1.2新浪微博站点分析
目前微博一共有三个可以接入站点,分别是[https://weibo.cn](https://weibo.cn)[https://m.weibo.com](https://m.weibo.com) 和[https://weibo.com](https://weibo.com) 这三个站点的复杂程度是逐渐提高的。而对于搜索接口,只能选择weibo.com和weibo.cn。weibo.com的筛选条件更加丰富,包括了地区,时间段更细,以小时为单位所以如果希望抓取尽可能多的关键词搜索结果,需要采用weibo.com。所以仅仅高级搜索有可能需要用到weibo.com,并且是你需要的搜索结果数据很大,并且筛选条件很细,比如地区,其他所有爬虫需求都可以通过weibo.cn这个站点来抓取,包括比较粗略的高级搜索。由于所需数据量不大,所以本次采用的是weibo.com接口。
# 二.新浪微博爬虫构建
## 2.1爬虫流程构建
由于新浪微博网站隐私策略的限制,大部分的微博内容需要登录之后才能进行访问,所以使用基于网络爬虫的方式进行信息的采集,在爬取之前必须通过一些模拟登录的方式进行验证,下图为爬虫的整体流程图。

首先要抓取到微博的数据,首先就是要登陆微博,否则就会重定向到登陆界面。而微博检测你是不是登陆了微博,就是检查你这次Request请求携带的cookie信息。所以要做的事情,就是登陆微博,获取cookie信息存下来,然后以后的请求带上这个cookie信息即可。
为了保障服务器的稳定,新浪微博做出了许多调整和限制,因此使用爬虫程序对新浪微博进行数据采集难度增大。于是在第三步发送请求时,我们需要使用代理,防止被屏蔽获取数据。下图为可选的代理方案,根据需求,本文选择了构建ip代理池的方法。

以下是构建的详细方式。
**def** get\_proxy\_nn(self):
proxy\_list = [] res = requests.get( **"http://www.xicidaili.com/nn"** , headers=self.headers) ip\_list = re.findall(**'\<td\>(\d+\.\d+\.\d+\.\d+)\</td\>'**, res.text) port\_list = re.findall(**'\<td\>(\d+)\</td\>'**, res.text) **for** ip, port **in** zip(ip\_list, port\_list): proxy\_list.append(ip + **":"** + port) **return** proxy\_list _#_ _验证代理是否能用_ **def** verify\_proxy(self, proxy\_list): **for** proxy **in** proxy\_list: proxies = { **"http"** : proxy } **try** : **if** requests.get( **'http://www.baidu.com'** , proxies=proxies, timeout=5).status\_code == 200: **if** proxy **not in** self.proxy\_list: self.proxy\_list.append(proxy) print( **'Success'** ,proxy) **except** : print( **'Fail'** ,proxy)
## 2.2新浪微博的转发数据封装和数据请求
在明确需求后,我们要知道需要爬的目标网页。经过实验,我们得到了两个可以获取json数据的网址。
**转发爬取** https://m.weibo.cn/api/statuses/repostTimeline?id={}&page={}
**评论爬取** https://m.weibo.cn/api/comments/show?id={}&page={}
其中id前面的部分https://m.weibo.cn/api/comments/show?应该是所有微博评论都一样的,id值是唯一的,每一个id对应一条微博,而page是表示一条微博的评论存放在多页里面,经过验证确实如此,而且page最大值就是100,100以后就不返回数据了。获取的是 json 数据。结构如下图所示。其中的0-9就是每条转发或者评论的详细信息。

试验后稳定性并不高,所以应对策略就是写一个 while True 死循环,page 循环递增,直到返回的 ok 值为 0 就好了。如果不加 cookie信息,无法访问跳转登录页面的话,状态码会是 404。所以再加一个判断语句,状态码是404的时候,才添加加我们的 cookie信息。能不用账号信息就不使用。如果用了 cookie 信息的话,稳妥一点还是让程序等个 3 秒钟,伪装是人为地使用微博,保护一下账号不要被屏蔽(或许可以再短一点,但是 3 秒这个间隔,经实验时可行的,所以就没有试其他的)。所以这写了下面这个函数来获取网页回传的 json 数据。
**def** getJson(mid,page,type,ippool): **global** cookie
**if** type== **'repost'** : url= **'https://m.weibo.cn/api/statuses/repostTimeline?id={}&page={}'**.format(mid,page) **else** : url= **'https://m.weibo.cn/api/comments/show?id={}&page={}'**.format(mid,page) headers = { **'User-agent'** : **'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:55.0) Gecko/20100101 Firefox/55.0'**, **'Host'** : **'m.weibo.cn'** , **'Accept'** : **'application/json, text/plain, \*/\*'** , **'Accept-Language'** : **'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3'** , **'Accept-Encoding'** : **'gzip, deflate, br'** , **'Referer'** : **'https://m.weibo.cn/status/'** + mid, **'DNT'** : **'1'** , **'Connection'** : **'keep-alive'** , }
proxy\_ip=ippool[random.randint(0,len(ippool)-1)] **while True** : **try** : res=requests.get(url=url,headers=headers, proxies=proxy\_ip,timeout=20) res.encoding=**'utf-8' **** if** res.status\_code==404: **if** **'cookie'** **in** headers.keys(): cookie=input( **'cookie**** 失效了,重新输入: ****'** ) headers[**'cookie'**]=cookie time.sleep(3) **continue break except **requests.exceptions.ProxyError** as** e: _#_ _如果是代理不行的话 _ print( **'**** 代理不行,尝试更换代理 ****'** ) ippool.remove(proxy\_ip) _#_ _代理池没有可用代理了的话,那就更新代理池 _ **if** len(ippool)\<1: ippool=ippool.buildippool() proxy\_ip=ippool[random.randint(0,len(ippool)-1)] **except** Exception **as** e: _#_ _其他错误的话,就打印输出看下,退出程序 _ print(e) sys.exit()
# 三.数据可视化
本章主要对数据库中所采集到的数据进行重组输出,运用词云图和Gephi的网络关系进行可视化,对可视化结果进行分类。
## 3.1分词 统计词频
中文分词,将中文语句切割成单独的词组。英文使用空格来分开每个单词的,而中文单独一个汉字跟词有时候完全不是同个含义,因此,中文分词相比英文分词难度高很多。Python的中文分词库有很多,本次分词所使用到的是jieba(结巴分词)。
其所涉及到的的算法包括:(1) 基于Trie树结构实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DAG);(2) 采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合;
结巴中文分词支持的多种分词模式,本次使用的是精确模式,试图将句子最精确地切开,适合文本分析。分词后利用python计数工具将词频进行统计,方便后续使用。

## 3.2生成词云
做好了中文分词后,下一步即是绘制云词图了。这里我们使用了另一个比较强大的库WordCloud。运行以下代码就可以直接出图了: **def** generate\_wordcloud(text): _''' _ _输入文本生成词云 __,__ 如果是中文文本需要先进行分词处理_ _ ''' #_ _设置显示方式 _ d=path.dirname(\_\_file\_\_) alice\_mask = np.array(Image.open(path.join(d, **"Images//test\_mask.png"** ))) font\_path=path.join(d, **"font//msyh.ttf"** ) stopwords = set(STOPWORDS) wc = WordCloud(background\_color= **"white"** ,_#_ _设置背景颜色 _ max\_words=2000, _#_ _词云显示的最大词数 _ mask=alice\_mask,_#_ _设置背景图片 _ stopwords=stopwords, _#_ _设置停用词 _ font\_path=font\_path, _#_ _兼容中文字体,不然中文会显示乱码 _ ) _#_ _生成词云 _ wc.generate(text) _#_ _生成的词云图像保存到本地 _ wc.to\_file(path.join(d, **"Images//test.png"** ))
下图是已#女大学生脚踹4岁女童#为案例,生成的评论词云图。

## 3.3生成网络图
Gephi是一款开源免费跨平台基于JVM的复杂网络分析软件,,其主要用于各种网络和复杂系统,动态和分层图的交互可视化与探测开源工具。开发者对它寄予的希望是:成为 "数据可视化领域的Photoshop" ,可运行在Windows,Linux及Mac os系统。本次使用gephi来生成社交网络图。
根据软件需要,我们使用爬取到的数据后进行数据清洗形成CSV格式文件。边文件((edge):前两列为源和目标节点ID,其他列为相关系数。节点文件(node):一列节点ID,其他为相关系数。


再通过调整边、节点等相关系数,最终形成转发动态网络图,过程图如下。
   
## 3.4应用讨论
随着国内外主流社会媒体的快速发展,社会媒体已经逐渐取代传统媒体,成为人们发布、分享信息的主要平台。微博搜索的结果页涵盖了精选微博、名人观点、用户吐槽、媒体声音、兴趣主页、相关用户等内容,尤其适合企业营销,对舆论公关的引导性强。而通过对微博的数据进行舆情监测,可以帮助企业解决危机信息预警、倾听消费之声、竞争情报分析营销效果反馈等方面的问题。
在信息扩散方面,通过动态的网络图,可以形成对一个事件的舆论传播途径,以形成简报、报告、图表等分析结果,为客户全面掌握群众思想动态,做出正确舆论引导,提供分析依据。
# 四.总结与展望
本次科研训练主要研究了基于Python语言编写爬虫程序对新浪微博进行数据采集,运用Gephi可视化软件对数据进行分析,形成信息扩散网络图等内容,但由于时间关系,本次研究的过程还存在一些不足之处,有待进一步研究。
1.尽管本次研究所生成的动态网络图是基于微博发布的时间等,但由于爬取的过程中,省略去了精确到分钟的部分,导致后续生成的动态图是以天为单位,而微博传播速度十分迅速,基本上对于一个事件的扩散在几天内即可完成,最终所形成的动态网络图时间间隔过大。
2.对于热度高的话题进行分析时,会发现有许多转发评论数据是网络水军和"僵尸号"所发布的,对研究并没有实际意义。对于如何剔除"僵尸号"所产生数据,值得进一步的研究。
|